namespace SmartMathLibrary.Simulation.LogicalGate
{
    /// <summary>
    /// Interface to implement a Byte class.
    /// </summary>
    public interface IByte
    {
        /// <summary>
        /// Gets or sets the bit at position 0.
        /// </summary>
        /// <value>The bit at position 0.</value>
        Bit Bit0 { get; set; }

        /// <summary>
        /// Gets or sets the bit at position 1.
        /// </summary>
        /// <value>The bit at position 1.</value>
        Bit Bit1 { get; set; }

        /// <summary>
        /// Gets or sets the bit at position 2.
        /// </summary>
        /// <value>The bit at position 2.</value>
        Bit Bit2 { get; set; }

        /// <summary>
        /// Gets or sets the bit at position 3.
        /// </summary>
        /// <value>The bit at position 3.</value>
        Bit Bit3 { get; set; }

        /// <summary>
        /// Gets or sets the bit at position 4.
        /// </summary>
        /// <value>The bit at position 4.</value>
        Bit Bit4 { get; set; }

        /// <summary>
        /// Gets or sets the bit at position 5.
        /// </summary>
        /// <value>The bit at position 5.</value>
        Bit Bit5 { get; set; }

        /// <summary>
        /// Gets or sets the bit at position 6.
        /// </summary>
        /// <value>The bit at position 6.</value>
        Bit Bit6 { get; set; }

        /// <summary>
        /// Gets or sets the bit at position 7.
        /// </summary>
        /// <value>The bit at position 7.</value>
        Bit Bit7 { get; set; }

        /// <summary>
        /// Gets or sets the bits of the byte.
        /// </summary>
        /// <value>The bits of the byte.</value>
        Bit[] Bits { get; }

        /// <summary>
        /// Compares the current instance of a byte instance to another.
        /// </summary>
        /// <param name="compare">The byte instance to compare.</param>
        /// <returns>True if the bit states is even to the specified byte instance 
        /// otherwise, false</returns>
        bool CompareTo(Byte compare);

        /// <summary>
        /// Copies the current instance.
        /// </summary>
        /// <returns>A copy of the current instance.</returns>
        Byte Copy();

        /// <summary>
        /// Shifts left.
        /// </summary>
        void ShiftLeft();

        /// <summary>
        /// Shifts right.
        /// </summary>
        void ShiftRight();

        /// <summary>
        /// Shifts left.
        /// </summary>
        /// <param name="times">The number of times to shift.</param>
        void ShiftLeft(int times);

        /// <summary>
        /// Shifts right.
        /// </summary>
        /// <param name="times">The number of times to shift.</param>
        void ShiftRight(int times);
    }
}